package br.com.consultsystems.dominio.financeiro;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.xml.bind.annotation.XmlRootElement;

import br.com.consultsystems.dominio.cadastro.Condominio;
import br.com.consultsystems.dominio.cadastro.Fornecedor;
import br.com.consultsystems.dominio.cadastro.Imovel;
import br.com.consultsystems.dominio.tipos.StatusFinanceiro;

@Entity
@Table(name = "titulo")
@SequenceGenerator(name = "operacao", sequenceName = "operacao",  allocationSize = 1)
@NamedQueries(
		{ 
			@NamedQuery(name = "queryTituloMaxNumero", query = "select max(t.numero) from Titulo t")
		}
	)
@XmlRootElement
public class Titulo implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -6984386653390054319L;

	@Id
	@Column(name = "id", nullable = false, insertable = true, updatable = false)
	@GeneratedValue(generator = "operacao", strategy = GenerationType.SEQUENCE)
	private Long id;
	
	@Column(name = "numero", nullable = false, insertable = true, updatable = true)
	private Integer numero;

	@Column(name = "parcela", nullable = false, insertable = true, updatable = true)
	private Short parcela;

	@Column(name = "quantidade", nullable = false, insertable = true, updatable = true)
	private Short quantidade;
	
	@Column(name = "emissao", nullable = false, insertable = true, updatable = false)
	@Temporal(TemporalType.DATE)
	private Date emissao;

	@Column(name = "vencimento", nullable = false, insertable = true, updatable = false)
	@Temporal(TemporalType.DATE)
	private Date vencimento;

	@Column(name = "vencimentoutil", nullable = false, insertable = true, updatable = false)
	@Temporal(TemporalType.DATE)
	private Date vencimentoutil;
	
	@Column(name = "valorfatura", nullable = false, insertable = true, updatable = true)
	private BigDecimal valorFatura;

	@Column(name = "valorTitulo", nullable = false, insertable = true, updatable = true)
	private BigDecimal valorTitulo;

	@Column(name = "saldotitulo", nullable = false, insertable = true, updatable = true)
	private BigDecimal saldotitulo;

	@Column(name = "status", nullable = false, insertable = true, updatable = true, length = 10)
	@Enumerated(EnumType.STRING)
	private StatusFinanceiro status;
	
	@ManyToOne
	@JoinColumn(name = "id_condominio", nullable = false, insertable = true, updatable = true)
	private Condominio condominio;	

	@ManyToOne
	@JoinColumn(name = "id_tipotitulo", nullable = false, insertable = true, updatable = true)
	private TipoTitulo tipoTitulo;	
	
	@ManyToOne
	@JoinColumn(name = "id_imovel", nullable = true, insertable = true, updatable = true)
	private Imovel imovel;

	@ManyToOne
	@JoinColumn(name = "id_fornecedor", nullable = true, insertable = true, updatable = true)
	private Fornecedor fornecedor;

	@ManyToOne
	@JoinColumn(name = "id_balancete", nullable = false, insertable = true, updatable = true)
	private Balancete balancete;	

	@ManyToOne
	@JoinColumn(name = "id_historico", nullable = false, insertable = true, updatable = true)
	private Historico historico;	
	
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Integer getNumero() {
		return numero;
	}

	public void setNumero(Integer numero) {
		this.numero = numero;
	}

	public Short getParcela() {
		return parcela;
	}

	public void setParcela(Short parcela) {
		this.parcela = parcela;
	}

	public Short getQuantidade() {
		return quantidade;
	}

	public void setQuantidade(Short quantidade) {
		this.quantidade = quantidade;
	}

	public Date getEmissao() {
		return emissao;
	}

	public void setEmissao(Date emissao) {
		this.emissao = emissao;
	}

	public Date getVencimento() {
		return vencimento;
	}

	public void setVencimento(Date vencimento) {
		this.vencimento = vencimento;
	}

	public Date getVencimentoutil() {
		return vencimentoutil;
	}

	public void setVencimentoutil(Date vencimentoutil) {
		this.vencimentoutil = vencimentoutil;
	}

	public BigDecimal getValorFatura() {
		return valorFatura;
	}

	public void setValorFatura(BigDecimal valorFatura) {
		this.valorFatura = valorFatura;
	}

	public BigDecimal getValorTitulo() {
		return valorTitulo;
	}

	public void setValorTitulo(BigDecimal valorTitulo) {
		this.valorTitulo = valorTitulo;
	}

	public BigDecimal getSaldotitulo() {
		return saldotitulo;
	}

	public void setSaldotitulo(BigDecimal saldotitulo) {
		this.saldotitulo = saldotitulo;
	}

	public StatusFinanceiro getStatus() {
		return status;
	}

	public void setStatus(StatusFinanceiro status) {
		this.status = status;
	}

	public Condominio getCondominio() {
		return condominio;
	}

	public void setCondominio(Condominio condominio) {
		this.condominio = condominio;
	}

	public Imovel getImovel() {
		return imovel;
	}

	public void setImovel(Imovel imovel) {
		this.imovel = imovel;
	}

	public Fornecedor getFornecedor() {
		return fornecedor;
	}

	public void setFornecedor(Fornecedor fornecedor) {
		this.fornecedor = fornecedor;
	}

	public TipoTitulo getTipoTitulo() {
		return tipoTitulo;
	}

	public void setTipoTitulo(TipoTitulo tipoTitulo) {
		this.tipoTitulo = tipoTitulo;
	}

	public Balancete getCompetencia() {
		return balancete;
	}

	public void setCompetencia(Balancete balancete) {
		this.balancete = balancete;
	}

	public Historico getHistorico() {
		return historico;
	}

	public void setHistorico(Historico historico) {
		this.historico = historico;
	}


	@Override
	public String toString() {
		return "Titulo [id=" + id + ", numero=" + numero + ", parcela="
				+ parcela + ", quantidade=" + quantidade + ", emissao="
				+ emissao + ", vencimento=" + vencimento + ", vencimentoutil="
				+ vencimentoutil + ", valorFatura=" + valorFatura
				+ ", valorTitulo=" + valorTitulo + ", saldotitulo="
				+ saldotitulo + ", status=" + status + ", condominio="
				+ condominio + ", tipoTitulo=" + tipoTitulo + ", imovel="
				+ imovel + ", fornecedor=" + fornecedor + ", balancete="
				+ balancete + ", historico=" + historico + "]";
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Titulo other = (Titulo) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}	
	
}
